home *** CD-ROM | disk | FTP | other *** search
/ Risc World 5 / Risc World 5.iso / SOFTWARE / Issue5 / PD / DIRSYNC / LegalStuff / gnudiff / system.h < prev    next >
C/C++ Source or Header  |  2004-12-19  |  10KB  |  410 lines

  1. /* System dependent declarations.
  2.  
  3.    Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1998, 2001, 2002
  4.    Free Software Foundation, Inc.
  5.  
  6.    This file is part of GNU DIFF.
  7.  
  8.    GNU DIFF is free software; you can redistribute it and/or modify
  9.    it under the terms of the GNU General Public License as published by
  10.    the Free Software Foundation; either version 2, or (at your option)
  11.    any later version.
  12.  
  13.    GNU DIFF is distributed in the hope that it will be useful,
  14.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.    GNU General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; see the file COPYING.
  20.    If not, write to the Free Software Foundation,
  21.    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  22.  
  23. #include <config.h>
  24.  
  25. /* Don't bother to support K&R C compilers any more; it's not worth
  26.    the trouble.  These macros prevent some library modules from being
  27.    compiled in K&R C mode.  */
  28. #ifndef __riscos
  29. #define PARAMS(Args) Args
  30. #endif
  31. #define PROTOTYPES 1
  32.  
  33. /* Define `__attribute__' and `volatile' first
  34.    so that they're used consistently in all system includes.  */
  35. #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) || __STRICT_ANSI__
  36. # define __attribute__(x)
  37. #endif
  38. #if defined const && !defined volatile
  39. # define volatile
  40. #endif
  41.  
  42. /* Verify a requirement at compile-time (unlike assert, which is runtime).  */
  43. #define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
  44.  
  45.  
  46. /* Determine whether an integer type is signed, and its bounds.
  47.    This code assumes two's (or one's!) complement with no holes.  */
  48.  
  49. /* The extra casts work around common compiler bugs,
  50.    e.g. Cray C 5.0.3.0 when t == time_t.  */
  51. #ifndef TYPE_SIGNED
  52. # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
  53. #endif
  54. #ifndef TYPE_MINIMUM
  55. # define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
  56.                    ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
  57.                    : (t) 0))
  58. #endif
  59. #ifndef TYPE_MAXIMUM
  60. # define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
  61. #endif
  62.  
  63. #ifndef __riscos
  64. #include <sys/types.h>
  65. #include <sys/stat.h>
  66. #endif
  67.  
  68. #if STAT_MACROS_BROKEN
  69. # undef S_ISBLK
  70. # undef S_ISCHR
  71. # undef S_ISDIR
  72. # undef S_ISFIFO
  73. # undef S_ISREG
  74. # undef S_ISSOCK
  75. #endif
  76. #ifndef S_ISDIR
  77. # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
  78. #endif
  79. #ifndef S_ISREG
  80. # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
  81. #endif
  82. #if !defined S_ISBLK && defined S_IFBLK
  83. # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
  84. #endif
  85. #if !defined S_ISCHR && defined S_IFCHR
  86. # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
  87. #endif
  88. #if !defined S_ISFIFO && defined S_IFFIFO
  89. # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO)
  90. #endif
  91. #if !defined S_ISSOCK && defined S_IFSOCK
  92. # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
  93. #endif
  94. #ifndef S_IXUSR
  95. # define S_IXUSR 0100
  96. #endif
  97. #ifndef S_IXGRP
  98. # define S_IXGRP 0010
  99. #endif
  100. #ifndef S_IXOTH
  101. # define S_IXOTH 0001
  102. #endif
  103.  
  104. #if HAVE_UNISTD_H
  105. # include <unistd.h>
  106. #endif
  107.  
  108. #ifndef SEEK_SET
  109. # define SEEK_SET 0
  110. #endif
  111. #ifndef SEEK_CUR
  112. # define SEEK_CUR 1
  113. #endif
  114.  
  115. #ifndef STDIN_FILENO
  116. # define STDIN_FILENO 0
  117. #endif
  118. #ifndef STDOUT_FILENO
  119. # define STDOUT_FILENO 1
  120. #endif
  121. #ifndef STDERR_FILENO
  122. # define STDERR_FILENO 2
  123. #endif
  124.  
  125. #if HAVE_TIME_H
  126. # include <time.h>
  127. #else
  128. # include <sys/time.h>
  129. #endif
  130.  
  131. #if HAVE_FCNTL_H
  132. # include <fcntl.h>
  133. #else
  134. # if HAVE_SYS_FILE_H
  135. #  include <sys/file.h>
  136. # endif
  137. #endif
  138.  
  139. #if !HAVE_DUP2
  140. # define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t))
  141. #endif
  142.  
  143. #ifndef O_RDONLY
  144. # define O_RDONLY 0
  145. #endif
  146. #ifndef O_RDWR
  147. # define O_RDWR 2
  148. #endif
  149. #ifndef S_IRUSR
  150. # define S_IRUSR 0400
  151. #endif
  152. #ifndef S_IWUSR
  153. # define S_IWUSR 0200
  154. #endif
  155.  
  156. #if HAVE_SYS_WAIT_H
  157. # include <sys/wait.h>
  158. #endif
  159. #ifndef WEXITSTATUS
  160. # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
  161. #endif
  162. #ifndef WIFEXITED
  163. # define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
  164. #endif
  165.  
  166. #ifndef STAT_BLOCKSIZE
  167. # if HAVE_STRUCT_STAT_ST_BLKSIZE
  168. #  define STAT_BLOCKSIZE(s) ((s).st_blksize)
  169. # else
  170. #  define STAT_BLOCKSIZE(s) (8 * 1024)
  171. # endif
  172. #endif
  173.  
  174. #if HAVE_DIRENT_H
  175. # include <dirent.h>
  176. # define NAMLEN(dirent) strlen ((dirent)->d_name)
  177. #else
  178. # define dirent direct
  179. # define NAMLEN(dirent) ((dirent)->d_namlen)
  180. # if HAVE_SYS_NDIR_H
  181. #  include <sys/ndir.h>
  182. # endif
  183. # if HAVE_SYS_DIR_H
  184. #  include <sys/dir.h>
  185. # endif
  186. # if HAVE_NDIR_H
  187. #  include <ndir.h>
  188. # endif
  189. #endif
  190.  
  191. #if HAVE_STDLIB_H
  192. # include <stdlib.h>
  193. #else
  194. # ifndef getenv
  195.    char *getenv ();
  196. # endif
  197. #endif
  198. #ifndef EXIT_SUCCESS
  199. # define EXIT_SUCCESS 0
  200. #endif
  201. #if !EXIT_FAILURE
  202. # undef EXIT_FAILURE /* Sony NEWS-OS 4.0C defines EXIT_FAILURE to 0.  */
  203. # define EXIT_FAILURE 1
  204. #endif
  205. #define EXIT_TROUBLE 2
  206.  
  207. #include <limits.h>
  208. #ifndef SSIZE_MAX
  209. # define SSIZE_MAX TYPE_MAXIMUM (ssize_t)
  210. #endif
  211.  
  212. #if HAVE_INTTYPES_H
  213. # include <inttypes.h>
  214. #endif
  215. #ifndef PTRDIFF_MAX
  216. # define PTRDIFF_MAX TYPE_MAXIMUM (ptrdiff_t)
  217. #endif
  218. #ifndef SIZE_MAX
  219. # define SIZE_MAX TYPE_MAXIMUM (size_t)
  220. #endif
  221. #ifndef UINTMAX_MAX
  222. # define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t)
  223. #endif
  224. #if ! HAVE_STRTOUMAX  && ! defined strtoumax
  225. uintmax_t strtoumax (char const *, char **, int);
  226. #endif
  227.  
  228. #include <stddef.h>
  229.  
  230. #if STDC_HEADERS || HAVE_STRING_H
  231. # include <string.h>
  232. #else
  233. # if !HAVE_STRCHR
  234. #  define strchr index
  235. #  define strrchr rindex
  236. # endif
  237. char *strchr (), *strrchr ();
  238. # if !HAVE_MEMCHR
  239. #  define memcmp(s1, s2, n) bcmp (s1, s2, n)
  240. #  define memcpy(d, s, n) bcopy (s, d, n)
  241. void *memchr ();
  242. # endif
  243. #endif
  244.  
  245. #if HAVE_LOCALE_H
  246. # include <locale.h>
  247. #else
  248. # define setlocale(category, locale)
  249. #endif
  250.  
  251. #ifndef __riscos
  252. #include <gettext.h>
  253.  
  254. #define _(msgid) gettext (msgid)
  255. #define N_(msgid) msgid
  256. #endif
  257.  
  258. #include <ctype.h>
  259.  
  260. /* CTYPE_DOMAIN (C) is nonzero if the unsigned char C can safely be given
  261.    as an argument to <ctype.h> macros like `isspace'.  */
  262. #if STDC_HEADERS
  263. # define CTYPE_DOMAIN(c) 1
  264. #else
  265. # define CTYPE_DOMAIN(c) ((unsigned int) (c) <= 0177)
  266. #endif
  267. #ifndef __riscos
  268. #define ISPRINT(c) (CTYPE_DOMAIN (c) && isprint (c))
  269. #define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c))
  270.  
  271. #if STDC_HEADERS
  272. # define TOLOWER(c) tolower (c)
  273. #else
  274. # ifndef _tolower
  275. #  define _tolower(c) tolower (c)
  276. # endif
  277. # define TOLOWER(c) (CTYPE_DOMAIN (c) && isupper (c) ? _tolower (c) : (c))
  278. #endif
  279.  
  280. /* ISDIGIT differs from isdigit, as follows:
  281.    - Its arg may be any int or unsigned int; it need not be an unsigned char.
  282.    - It's guaranteed to evaluate its argument exactly once.
  283.    - It's typically faster.
  284.    POSIX 1003.1-2001 says that only '0' through '9' are digits.
  285.    Prefer ISDIGIT to isdigit unless it's important to use the locale's
  286.    definition of `digit' even when the host does not conform to POSIX.  */
  287. #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
  288. #endif
  289.  
  290. #include <errno.h>
  291. #if !STDC_HEADERS
  292.  extern int errno;
  293. #endif
  294.  
  295. #include <signal.h>
  296. #ifndef SA_RESTART
  297. # ifdef SA_INTERRUPT /* e.g. SunOS 4.1.x */
  298. #  define SA_RESTART SA_INTERRUPT
  299. # else
  300. #  define SA_RESTART 0
  301. # endif
  302. #endif
  303. #if !defined SIGCHLD && defined SIGCLD
  304. # define SIGCHLD SIGCLD
  305. #endif
  306.  
  307. #undef MIN
  308. #undef MAX
  309. #define MIN(a, b) ((a) <= (b) ? (a) : (b))
  310. #define MAX(a, b) ((a) >= (b) ? (a) : (b))
  311.  
  312. #if HAVE_STDBOOL_H
  313. # include <stdbool.h>
  314. #else
  315. # define bool unsigned char
  316. #endif
  317.  
  318. #if HAVE_VFORK_H
  319. # include <vfork.h>
  320. #endif
  321.  
  322. #if ! HAVE_WORKING_VFORK
  323. # define vfork fork
  324. #endif
  325.  
  326. /* Type used for fast comparison of several bytes at a time.  */
  327.  
  328. #ifndef word
  329. # define word uintmax_t
  330. #endif
  331.  
  332. /* The integer type of a line number.  Since files are read into main
  333.    memory, ptrdiff_t should be wide enough.  */
  334.  
  335. typedef ptrdiff_t lin;
  336. #define LIN_MAX PTRDIFF_MAX
  337. verify (lin_is_signed, TYPE_SIGNED (lin));
  338. verify (lin_is_wide_enough, sizeof (ptrdiff_t) <= sizeof (lin));
  339. verify (lin_is_printable_as_long, sizeof (lin) <= sizeof (long));
  340.  
  341. /* This section contains POSIX-compliant defaults for macros
  342.    that are meant to be overridden by hand in config.h as needed.  */
  343.  
  344. #ifndef file_name_cmp
  345. # define file_name_cmp strcmp
  346. #endif
  347.  
  348. #ifndef initialize_main
  349. # define initialize_main(argcp, argvp)
  350. #endif
  351.  
  352. #ifndef NULL_DEVICE
  353. # define NULL_DEVICE "/dev/null"
  354. #endif
  355.  
  356. /* Do struct stat *S, *T describe the same special file?  */
  357. #ifndef same_special_file
  358. # if HAVE_ST_RDEV && defined S_ISBLK && defined S_ISCHR
  359. #  define same_special_file(s, t) \
  360.      (((S_ISBLK ((s)->st_mode) && S_ISBLK ((t)->st_mode)) \
  361.        || (S_ISCHR ((s)->st_mode) && S_ISCHR ((t)->st_mode))) \
  362.       && (s)->st_rdev == (t)->st_rdev)
  363. # else
  364. #  define same_special_file(s, t) 0
  365. # endif
  366. #endif
  367.  
  368. /* Do struct stat *S, *T describe the same file?  Answer -1 if unknown.  */
  369. #ifndef same_file
  370. # define same_file(s, t) \
  371.     ((((s)->st_ino == (t)->st_ino) && ((s)->st_dev == (t)->st_dev)) \
  372.      || same_special_file (s, t))
  373. #endif
  374.  
  375. /* Do struct stat *S, *T have the same file attributes?
  376.  
  377.    POSIX says that two files are identical if st_ino and st_dev are
  378.    the same, but many filesystems incorrectly assign the same (device,
  379.    inode) pair to two distinct files, including:
  380.  
  381.    - GNU/Linux NFS servers that export all local filesystems as a
  382.      single NFS filesystem, if a local device number (st_dev) exceeds
  383.      255, or if a local inode number (st_ino) exceeds 16777215.
  384.  
  385.    - Network Appliance NFS servers in snapshot directories; see
  386.      Network Appliance bug #195.
  387.  
  388.    - ClearCase MVFS; see bug id ATRia04618.
  389.  
  390.    Check whether two files that purport to be the same have the same
  391.    attributes, to work around instances of this common bug.  Do not
  392.    inspect all attributes, only attributes useful in checking for this
  393.    bug.
  394.  
  395.    It's possible for two distinct files on a buggy filesystem to have
  396.    the same attributes, but it's not worth slowing down all
  397.    implementations (or complicating the configuration) to cater to
  398.    these rare cases in buggy implementations.  */
  399.  
  400. #ifndef same_file_attributes
  401. # define same_file_attributes(s, t) \
  402.    ((s)->st_mode == (t)->st_mode \
  403.     && (s)->st_nlink == (t)->st_nlink \
  404.     && (s)->st_uid == (t)->st_uid \
  405.     && (s)->st_gid == (t)->st_gid \
  406.     && (s)->st_size == (t)->st_size \
  407.     && (s)->st_mtime == (t)->st_mtime \
  408.     && (s)->st_ctime == (t)->st_ctime)
  409. #endif
  410.